package com.xhermit.learn.footprint.spring.aop;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

/**
 * @version 3.0
 * @author FangJun
 * @date 2017年2月24日
 */
@Aspect
public class LogAspect {

	/**
	 * execution(<修饰符模式>? <返回类型模式> <方法名模式>(<参数模式>) <异常模式>?) 
	 * execution(): 表达式主体
	 * 第一个*号：表示返回类型，*号表示所有的类型。
	 *  包名：表示需要拦截的包名，后面的两个句点表示当前包和当前包的所有子包，com.xhermit包、子孙包下所有类的方法。
	 *  第二个*号：表示类名，*号表示所有的类。
	 *  *(..):最后这个星号表示方法名，*号表示所有的方法，后面括弧里面表示方法的参数，两个句点表示任何参数。
	 * @author  FangJun
	 * @date 2017年2月24日
	 */
	@Pointcut("execution(* com.xhermit.learn.footprint.spring.aop..*.*(..))")
	public void logPointcut(){
		
	}

	@Around("logPointcut()")
	public void  doLog(ProceedingJoinPoint pjp){
		long startTime=System.currentTimeMillis();
		try {
			pjp.proceed();
		} catch (Throwable e) {
			e.printStackTrace();
		}
		
		System.out.println(pjp.getSignature().getName() +" exec cost time (ms): "+(System.currentTimeMillis()-startTime));
	}
	
}
